import java.util.Scanner;

public class Main {

    //挖矿
    //首先输入 n,m
    // n 为矿洞数量，m 为步数
    //创建一个前缀和 sum 数组
    //由于数轴上可能有负数，且给定值范围为 -10^6 <= ai <= 10^6
    //且在 Java 中，数组下标不能为负，我们为了保证全为正数，则需要定义一个 N  = (int)1e6 + 10;
    //输入一个 x，填充数组sum，表示在 x 下标有几个矿洞，且注意，下标要表示为 x + N
    //遍历数组计算前缀和
    //然后扫描拐点
    //有左右两种路径：
    //先走左边，再转向右边
    //先走右边，再转向左边
    //定义两种路径获得的矿石数
    //最后输出两者的最大值

    public static final int N = (int)1e6 + 10;

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int n = scan.nextInt();
        int m = scan.nextInt();

        int[] sum = new int[2 * N];
        for (int i = 0; i < n; i++) {
            int x = scan.nextInt();
            sum[x + N]++;
        }

        for (int i = 1; i < 2 * N; i++) {
            sum[i] += sum[i - 1];
        }

        int ans1 = 0;
        int ans2 = 0;
        //扫描左拐点
        for (int i = 1; i < N; i++) {
            if(N - i <= m){
                int l = i;
                int r = m - 2 * l;
                ans1 = sum[r] - sum[l];
            }
        }

        //扫描右拐点
        for (int i = N; i < N * 2; i++) {
            if(i - N <= m){
                int r = i;
                int l = m - 2 * r;
                ans2 = sum[l] - sum[r];
            }
        }
        System.out.println(Math.max(ans1,ans2));
        scan.close();
    }
}
